package com.example.springexcel.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Slf4j
@Component
public class ExcelFileUtils {

    /**
     * 创建excel文件
     *
     * @param filePath      文件路径
     * @param dataList      excel数据列表
     * @param sheetName     工作表名称
     * @param clazz         数据封装的类型
     * @param <T>           数据封装的类型
     */
    public static <T> void createExcel(String filePath, List<T> dataList, String sheetName, Class<T> clazz) {
        EasyExcel.write(filePath, clazz).sheet(sheetName).doWrite(dataList);
    }

    /**
     * 创建excel文件
     *
     * @param filePath      文件路径
     * @param dataList      excel数据列表
     * @param sheetName     工作表名称
     */
    public static  void createExcel(String filePath, List<?> dataList, String sheetName){
        EasyExcel.write(filePath, dataList.get(0).getClass()).sheet(sheetName).doWrite(dataList);
    }

    /**
     * 创建excel文件
     *
     * @param filePath    文件路径
     * @param scheduleMap excel数据列表
     * @param sheetName   工作表名称
     */
    public static void createExcel(String filePath, Map<String, List<String>> scheduleMap, String sheetName) {
        List<List<String>> dataList = new ArrayList<>();

        for (Map.Entry<String, List<String>> entry : scheduleMap.entrySet()) {
            List<String> row = new ArrayList<>();
            row.add(entry.getKey()); // 添加星期几
            row.addAll(entry.getValue()); // 添加对应的名字列表
            dataList.add(row);
        }

        EasyExcel.write(filePath).sheet(sheetName).doWrite(dataList);
    }

    /**
     * 创建excel文件
     * 将 多个 数据列表 添加到 一个excel文件 的多个工作表中
     *
     * @param filePath    文件路径
     * @param sheetName   工作表名称 与 数据列表
     */
    public static void ListCreateExcel(String filePath, Map<String, List<?>> sheetName) {
        try (ExcelWriter excelWriter = EasyExcel.write(filePath).build()) {
            sheetName.forEach((name, dataList) -> {
                excelWriter.write(dataList,  EasyExcel.writerSheet(name)
                        .head(dataList.get(0).getClass()) // 指定表头模型
                        .build()); // 写入数据
            });
        }
    }

    /**
     * 在excel文件中添加数据
     *
     * @param filePath 文件路径
     * @param dataList 数据列表
     * @param clazz    数据封装的类型
     * @param <T>      数据封装的类型
     */
    public <T> void addDataToExcel(File filePath, List<T> dataList, Class<T> clazz) {
        File tempFile = null;
        try {
            tempFile = File.createTempFile("tmp", ".xlsx");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //tempFile.deleteOnExit();
        //System.out.println(tempFile.getAbsolutePath());
        EasyExcel.write(filePath, clazz).needHead(false).
                withTemplate(filePath).file(tempFile).sheet().doWrite(dataList);
        if (tempFile.exists()) {
            filePath.delete();
            tempFile.renameTo(filePath);
        }
    }


}
